home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / BBS-Archive / Dev / GNU-TILE-FORTH.lha / src / error.c < prev    next >
C/C++ Source or Header  |  1992-05-19  |  5KB  |  181 lines

  1. /*
  2.   C BASED FORTH-83 MULTI-TASKING KERNEL ERROR MANAGEMENT 
  3.  
  4.   Copyright (C) 1989-1990 by Mikael Patel
  5.  
  6.   Computer Aided Design Laboratory (CADLAB)
  7.   Department of Computer and Information Science
  8.   Linkoping University
  9.   S-581 83 LINKOPING
  10.   SWEDEN
  11.  
  12.   Email: mip@ida.liu.se
  13.   
  14.   Started on: 7 March 1989
  15.  
  16.   Last updated on: 20 June 1990
  17.  
  18.   Dependencies:
  19.        (cc) signal.h, fcntl.h, kernel.h, memory.h, io.h, error.h 
  20.  
  21.   Description:
  22.        Handles low level signal to error message conversion and printing.
  23.        Low level signals from the run-time environment are transformation
  24.        to forth level exceptions and may be intercepted by an exception
  25.        block.
  26.   
  27.   Copying:
  28.        This program is free software; you can redistribute it and/or modify
  29.        it under the terms of the GNU General Public License as published by
  30.        the Free Software Foundation; either version 1, or (at your option)
  31.        any later version.
  32.  
  33.        This program is distributed in the hope that it will be useful,
  34.        but WITHOUT ANY WARRANTY; without even the implied warranty of
  35.        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  36.        GNU General Public License for more details.
  37.  
  38.        You should have received a copy of the GNU General Public License
  39.        along with this program; see the file COPYING.  If not, write to
  40.        the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  41.  
  42. */
  43.  
  44. #include <signal.h>
  45. #include <fcntl.h>
  46. #include "kernel.h"
  47. #include "memory.h"
  48. #include "io.h"
  49. #include "error.h"
  50.  
  51.  
  52. /* ENVIRONMENT FOR LONGJMP AND RESTART AFTER ERROR SIGNAL */
  53.  
  54. jmp_buf restart;
  55.  
  56.  
  57. /* SIGNAL MESSAGE TABLE AND SIZE */
  58.  
  59. #define SIGNALMSGSIZE 20
  60.  
  61. static char *signalmsg[SIGNALMSGSIZE] = {
  62.     "io error",
  63.     "hangup",
  64.     "interrupt",
  65.     "quit",
  66.     "illegal instruction",
  67.     "trace trap",
  68.     "abort",
  69.     "emulator trap",
  70.     "arithmetic exception",
  71.     "kill",
  72.     "bus error",
  73.     "segmentation violation",
  74.     "bad argument to system call",
  75.     "write to a pipe or other socket with no one to read it",
  76.     "alarm clock",
  77.     "software termination",
  78.     "urgent condition on IO channel",
  79.     "sendable stop signal not from tty",
  80.     "stop signal from tty",
  81.     "continue after stop"
  82.     };
  83.  
  84.  
  85. VOID error_signal(sig)
  86.     long sig;
  87. {
  88.     /* Check which task received the signal */
  89.     if (tp == foreground)
  90.     (VOID) fprintf(io_errf, "foreground#%d: ", foreground);
  91.     else
  92.     (VOID) fprintf(io_errf, "task#%d: ", tp);
  93.  
  94.     /* Print the signal number and a short description */
  95.     if (sig < SIGNALMSGSIZE)
  96.     (VOID) fprintf(io_errf, "signal#%d: %s\n", sig, signalmsg[sig]);
  97.     else
  98.     (VOID) fprintf(io_errf, "exception#%d: %s\n", sig, ((ENTRY) sig) -> name);
  99.  
  100.     /* Abort the current virtual machine call */
  101.     doabort();
  102. }
  103.  
  104. VOID error_fatal(sig)
  105.     int sig;            /* Signal number */
  106. {
  107.     /* Notify the error signal */
  108.     error_signal((long) sig);
  109.  
  110.     /* Clean up the mess after all the packages */
  111.     io_finish();
  112.     error_finish();
  113.     kernel_finish();
  114.     memory_finish();
  115.     
  116.     /* Exit and pass on the signal number */
  117.     exit(sig);
  118. }
  119.  
  120. VOID error_restart(sig)
  121.     int sig;            /* Signal number */
  122. {
  123.     /* Check the type of signal and perform an appropriate action */
  124.     switch (sig) {
  125.       case SIGTSTP:
  126.     (VOID) fcntl(STDIN, F_SETFL, 0);
  127.     (VOID) kill(getpid(), SIGSTOP);
  128.     return;
  129.       case SIGCONT:
  130.     (VOID) fcntl(STDIN, F_SETFL, FNDELAY);
  131.     return;
  132.       default:
  133.     /* Check if the lowest file descriptor is a tty */
  134.     if (isatty(io_infstack[0] -> fd)) {
  135.         
  136.         /* Close all other files */
  137.         io_flush();
  138.  
  139.         /* Check for interrupt in input management */
  140.         if ((sig == SIGINT || sig == SIGQUIT) && !running) {
  141.  
  142.         /* Notify the type of signal */
  143.         error_signal((long) sig);
  144.         }
  145.         else
  146.         /* Warm start the kernel and pass on the signal number */
  147.         longjmp(restart, sig);    
  148.     }
  149.     else error_fatal(sig);
  150.     }
  151. }
  152.  
  153. VOID error_initiate()
  154. {
  155.     /* Add error_fatal and error_restart as signal handlers */
  156.     (VOID) signal(SIGHUP,  error_fatal);
  157.     (VOID) signal(SIGINT,  error_restart);
  158.     (VOID) signal(SIGQUIT, error_restart);
  159.     (VOID) signal(SIGILL,  error_restart);
  160.     (VOID) signal(SIGTRAP, error_fatal);
  161.     (VOID) signal(SIGIOT,  error_fatal);
  162.     (VOID) signal(SIGEMT,  error_fatal);
  163.     (VOID) signal(SIGFPE,  error_restart);
  164.     (VOID) signal(SIGBUS,  error_restart);
  165.     (VOID) signal(SIGSEGV, error_restart);
  166.     (VOID) signal(SIGSYS,  error_restart);
  167.     (VOID) signal(SIGPIPE, error_restart);
  168.     (VOID) signal(SIGALRM, error_restart);
  169.     (VOID) signal(SIGTERM, error_fatal);
  170.     (VOID) signal(SIGURG,  error_restart);
  171.     (VOID) signal(SIGSTOP, error_fatal);
  172.     (VOID) signal(SIGTSTP, error_restart);
  173.     (VOID) signal(SIGCONT, error_restart);
  174. }
  175.  
  176. VOID error_finish()
  177. {
  178.     /* Future clean up function for the error package */
  179. }
  180.  
  181.